package com.pennywise.service;

import cn.hutool.core.date.DateUtil;
import com.pennywise.mapper.TransactionMapper;
import com.pennywise.model.CategoryStats;
import com.pennywise.model.Transaction;
import com.pennywise.model.MonthlyStats;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 交易记录服务
 * 处理所有与交易相关的业务逻辑
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class TransactionService {
    
    private final TransactionMapper transactionMapper;
    
    private static final String TYPE_INCOME = "INCOME";
    private static final String TYPE_EXPENSE = "EXPENSE";
    
    /**
     * 添加新的交易记录
     *
     * @param transaction 交易记录信息
     */
    @Transactional
    public void addTransaction(Transaction transaction) {
        log.info("添加新交易记录: {}", transaction);
        transaction.setCreateTime(LocalDateTime.now());
        transactionMapper.insert(transaction);
        log.info("交易记录添加成功，ID: {}", transaction.getId());
    }
    
    /**
     * 根据ID获取交易记录
     *
     * @param id 交易记录ID
     * @return 交易记录详情
     */
    public Transaction getTransaction(Long id) {
        log.debug("获取交易记录，ID: {}", id);
        Transaction transaction = transactionMapper.findById(id);
        if (transaction == null) {
            log.warn("未找到交易记录，ID: {}", id);
        }
        return transaction;
    }
    
    /**
     * 更新交易记录
     *
     * @param transaction 更新的交易记录信息
     */
    @Transactional
    public void updateTransaction(Transaction transaction) {
        log.info("更新交易记录: {}", transaction);
        transactionMapper.update(transaction);
        log.info("交易记录更新成功，ID: {}", transaction.getId());
    }
    
    /**
     * 删除交易记录
     *
     * @param id 要删除的交易记录ID
     */
    @Transactional
    public void deleteTransaction(Long id) {
        log.info("删除交易记录，ID: {}", id);
        transactionMapper.deleteById(id);
        log.info("交易记录删除成功，ID: {}", id);
    }
    
    /**
     * 按时间范围查询交易记录
     *
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 交易记录列表
     */
    public List<Transaction> getTransactionsByTimeRange(LocalDateTime startTime, LocalDateTime endTime) {
        log.debug("查询时间范围内的交易记录: {} - {}", startTime, endTime);
        List<Transaction> transactions = transactionMapper.findByTimeRange(startTime, endTime);
        log.debug("查询到{}条交易记录", transactions.size());
        return transactions;
    }
    
    /**
     * 获取指定类型和时间范围的消费分类统计
     *
     * @param type 交易类型（收入/支出）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 分类统计列表
     */
    public List<CategoryStats> getCategoryStats(String type, LocalDateTime startTime, LocalDateTime endTime) {
        log.debug("统计{}类型交易: {} - {}", type, startTime, endTime);
        List<CategoryStats> stats = transactionMapper.getCategoryStats(type, startTime, endTime);
        log.debug("统计结果: {}", stats);
        return stats;
    }
    
    /**
     * 获取月度统计数据
     */
    public List<MonthlyStats> getMonthlyStats(LocalDateTime startTime, LocalDateTime endTime) {
        log.debug("获取月度统计: {} - {}", startTime, endTime);
        List<MonthlyStats> stats = transactionMapper.getMonthlyStats(startTime, endTime);
        log.debug("获取到{}条月度统计记录", stats.size());
        return stats;
    }
} 